package com.atguigu.gulimall.auth.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.atguigu.common.utils.R;
import com.atguigu.gulimall.auth.feign.MemberFeignService;
import com.atguigu.gulimall.auth.util.HttpUtils;
import com.atguigu.common.vo.MemberResponseVo;
import com.atguigu.gulimall.auth.vo.SocialUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;


@Slf4j
@Controller
public class OAuth2Controller {
    /**
     * 1)、中央认证服务器  ssoserver.com
     * 2)、其他系统，想要登录去ssoserver.com登录，登录成功跳转回来
     * 3）、只要有一个登录，其他都不用登录
     * 4）、全系统统一一个sso-sessionid,所有系统可能域名都不同
     */

    @Autowired
    MemberFeignService memberFeignService;


    @GetMapping("/oauth2.0/weibo/success")
    public String weibo(@RequestParam("code") String code, HttpSession session) throws Exception {

        //根据code换取accessTocken
        Map<String,String> header = new HashMap<>(1);
        Map<String,String> query = new HashMap<>(1);

        Map<String,String> map = new HashMap<>();
        map.put("client_id","2481126500");
        map.put("client_secret","1244c25ada94b06ca2468d0893272b26");
        map.put("grant_type","authorization_code");
        map.put("redirect_uri","http://auth.gulimall.com/oauth2.0/weibo/success");
        map.put("code",code);

        HttpResponse response = HttpUtils.doPost("https://api.weibo.com", "/oauth2/access_token", "POST", header, query, map);
        if(response.getStatusLine().getStatusCode() != 200){
            return "redirect:http://auth.gulimall.com/login.html";
        }
        //获取accessToken
        String json = EntityUtils.toString(response.getEntity());
        SocialUser socialUser = JSON.parseObject(json, SocialUser.class);
        //当用户如果是第一次app或者网站，自动注册进来(为当前社交用户生成一个会员信息账号，
        // 以后这个社交账号就指定对应指定的会员)
        R r = memberFeignService.oauthlogin(socialUser);
        if(r.getCode() != 0){
            //登录失败
            return "redirect:http://auth.gulimall.com/login.html";
        }
        //登录成功

        //不同域名：使用spring session redis存储共享同步session
        //同域名：父域名与子域名之间共享同步session
        //第一次使用sesion，命令浏览保存卡号,JSESSIONID这个cookie
        //以后app或浏览器访问哪个网站就会带上这个网站的cookie
        //子域之间  gulimall.com,auth.gulimall.com,product.gulimall.com
        //发卡时(指定域名为父域名)，即使是子域发卡时，也能让父域也能使用
        MemberResponseVo data = r.getData("data", new TypeReference<MemberResponseVo>() {});
        //System.out.println("登录成功," + data);
        log.info("登录成功,用户信息：{}" , data.toString());
        //TODO 1、默认发的令牌，session=dasjkdjl。作用域为当前域(解决子域session共享问题)
        //TODO 2、使用json序列方式来序列化到redis中
        session.setAttribute("loginUser",data);
        return "redirect:http://gulimall.com";
    }
}
